home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Mark Pilgrim / Mousebroken 1.0.1 / source / Modules source ƒ / Corner mouse / Corner module.c next >
Encoding:
C/C++ Source or Header  |  1994-10-30  |  1.9 KB  |  101 lines  |  [TEXT/KAHL]

  1. /* Corner Mouse -- a Mousebroken mouse module */
  2. /* written 11/93 by Mark Pilgrim */
  3. /* This module placed in the public domain. */
  4.  
  5. #include "Retrace.h"
  6. #include "GestaltEQU.h"
  7.  
  8. extern Boolean CrsrNew : 0x8CE;
  9. extern Point mTemp : 0x828;
  10. extern Point RawMouse : 0x82C;
  11.  
  12. Rect            gMainScreenBounds;
  13. unsigned long    me;
  14. Boolean            isInCorner;
  15. Boolean            goingToCorner;
  16. int                stickCount;
  17. int                newX,newY;
  18.  
  19. #define MAX_STICK_COUNT        30
  20. #define GRADIENT            5
  21.  
  22. void header(void);
  23. void main(void);
  24.  
  25. void header(void)
  26. {
  27.     asm
  28.     {
  29.         dc.l    0
  30.         move.l a0, d0
  31.         lea header, a0
  32.         jmp main
  33.     }
  34. }
  35.  
  36. #include "SetUpA4.h"
  37.  
  38. void main(void)
  39. {
  40.     VBLTask*        myVBL;
  41.     long            gestalt_temp;
  42.     OSErr            isHuman;
  43.     Boolean            isDormant;
  44.     
  45.     RememberA0();
  46.     SetUpA4();
  47.     
  48.     asm
  49.     {
  50.         move.l d0, myVBL
  51.     }
  52.     
  53.     if (me != 'MMdl')
  54.     {
  55.         isHuman = Gestalt(gestaltQuickdrawVersion, &gestalt_temp);
  56.         gMainScreenBounds=(isHuman || (gestalt_temp < gestalt8BitQD)) ? screenBits.bounds :
  57.             (**GetMainDevice()).gdRect;
  58.         me = 'MMdl';
  59.         isInCorner=FALSE;
  60.     }
  61.     
  62.     isDormant=FALSE;
  63.     if (!isInCorner)
  64.     {
  65.         newX=(RawMouse.h-gMainScreenBounds.left<
  66.             (gMainScreenBounds.right-gMainScreenBounds.left)/2) ?
  67.             gMainScreenBounds.left : gMainScreenBounds.right-1;
  68.         newY=(RawMouse.v-gMainScreenBounds.top<
  69.             (gMainScreenBounds.bottom-gMainScreenBounds.top)/2) ?
  70.             gMainScreenBounds.top : gMainScreenBounds.bottom-1;
  71.         RawMouse.h+=(newX-RawMouse.h)/GRADIENT;
  72.         RawMouse.v+=(newY-RawMouse.v)/GRADIENT;
  73.         mTemp.h=RawMouse.h;
  74.         mTemp.v=RawMouse.v;
  75.         if ((RawMouse.h-newX>-GRADIENT) && (RawMouse.h-newX<GRADIENT) &&
  76.             (RawMouse.v-newY>-GRADIENT) && (RawMouse.v-newY<GRADIENT))
  77.         {
  78.             isInCorner=TRUE;
  79.             stickCount=MAX_STICK_COUNT;
  80.         }
  81.     }
  82.     else
  83.     {
  84.         if ((RawMouse.h!=newX) || (RawMouse.v!=newY))
  85.         {
  86.             RawMouse.h=mTemp.h=newX;
  87.             RawMouse.v=mTemp.v=newY;
  88.             stickCount--;
  89.             if (!stickCount)
  90.             {
  91.                 isInCorner=FALSE;
  92.                 isDormant=TRUE;
  93.             }
  94.         }
  95.     }
  96.     
  97.     CrsrNew = TRUE;
  98.     myVBL->vblCount = isDormant ? 15000 : 1;
  99.     RestoreA4();
  100. }
  101.